בעץ B המשתמש בהכנסה ומחיקה בשני מעברים (two pass), החל ממצב של עץ ריק, לכל רצף של פעולות הכנסה ומחיקה, מספר הפעולות הכולל של מיזוג, פיצול והזזה חסום ממעל ב- .
שיטת החישוב:
עלות כל פעולת מיזוג, פיצול והזזה מוגדרת כ-1.
החיוב הנגבה עבור כל פעולת הכנסה או מחיקה הוא .
שמירה על אינווריאנטה:
כל צומת שאיננו השורש ויש בו מפתחות יאגור 0.5 מטבעות.
כל צומת עמוס שיש בו מפתחות יאגור 1.5 מטבעות.
ניתוח פעולת הכנסה:
כאשר מתבצעת הכנסה והצומת מגיע ל- מפתחות, הוא יפוצל לשני צמתים בעלי ו- מפתחות.
את העלות של פעולת הפיצול (1) אנו מממנים באמצעות ה-1.5 מטבעות שנאגרו בצומת העמוס, ואת ה-0.5 מטבעות הנותרים אנו מניחים בצומת החדש שנוצר עם ה- מפתחות.
אם מספר המפתחות בצומת האב עולה ל-, ניקח 1.5 מטבעות מתוך החיוב המקורי ששילמנו על פעולת ההכנסה כולה ונניח אותם עליו.
ניתוח פעולת מחיקה:
בפעולת מיזוג, שני צמתים עם מפתחות מתאחדים לצומת אחד בעל מפתחות. העלות למיזוג משולמת על ידי שימוש ב-0.5 מטבעות שהיו אגורים בכל אחד מהצמתים המתמזגים.
אם מתבצעת פעולת הזזה (Shift), נשתמש ב-1 מטבעות מהחיוב של פעולת המחיקה כדי לשלם עליה.
אם לאחר מחיקה או הזזה מספר המפתחות של הצומת או של אחיו יורד בדיוק ל-, לוקחים 0.5 מטבעות מהחיוב ומניחים עליו כדי לשמר את האינווריאנטה.
ביטול האמורטיזציה של גיבוב מחדש (Deamortization of rehashing):
המטרה:
בטבלאות גיבוב , אנו שואפים לשמור על יחס תפוסה (Load factor) של כדי להבטיח זמן חיפוש של תוך שימוש במקום זיכרון פרופורציונלי למידע .
פעולת הגיבוב מחדש (Rehashing) הרגילה מעניקה לנו זמן ריצה אמורטיזי של , אך במקרה הגרוע ביותר דורשת בבת אחת. המטרה פה היא להראות איך אפשר להפוך את פעולת ה-Rehashing כך שתדרוש תמיד זמן של גם במקרה הגרוע ביותר.
אופן הפעולה (הכנסה הדרגתית):
אנו מנהלים ושומרים תמיד שתי טבלאות גיבוב במקביל:
טבלה ראשית בגודל
טבלה חלופית בגודל .
ברגע שטבלה מגיעה בדיוק לחצי מקיבולתה ( איברים), הטבלה החדשה תיווצר ותהיה ריקה.
בכל אחת מ- פעולות ההכנסה הבאות, נבצע צעדים בודדים מתוך אלגוריתם ההעתקה המלא:
אם האיבר החדש הוכנס אחרי סמן הסריקה הנוכחי שלנו, נבצע 4 צעדי העתקה לטבלה החדשה.
אחרת, נכניס אותו ישירות אל ונבצע 3 צעדים.
כאשר טבלה מתמלאת לחלוטין (מגיעה ל- איברים), כל האיברים שלה למעשה כבר הספיקו לעבור ל- באופן הדרגתי. בשלב זה פשוט מחליפים מצביעים () ומייצרים טבלה חלופית חדשה שגודלה יהיה (בעזרת מערך חכם).
עצי BB():
הגדרות ומושגי יסוד:
פונקציית הגודל מייצגת את מספר הקודקודים הנמצאים בתת-העץ ששורשו הוא .
קודקוד מוגדר כבעל איזון חסום אם ורק אם מתקיים: גודל תת-העץ השמאלי שלו מקיים וגודל תת-העץ הימני מקיים .
עץ מטיפוס זה (עבור ) הוא עץ חיפוש בינארי בו כל הצמתים מקיימים את חסם האיזון . במצב כזה מובטח שגובה העץ חסום על ידי .
פעולות הכנסה ומחיקה (Insertion and deletion):
תחילה מכניסים או מוחקים איבר בדיוק כמו בעץ חיפוש בינארי רגיל.
בודקים אם האיזון הופר, ומוצאים את הצומת הגבוה ביותר (קרוב ביותר לשורש) שנקרא אשר חורג מחסם האיזון .
במידה וצומת כזה קיים, מחליפים את כל תת-העץ של בעץ חדש המאוזן בצורה מושלמת ומכיל את אותם איברים.
סיבוכיות הזמן: במקרה הגרוע ביותר לבניה מחדש זו היא פרופורציונלית לגודל תת-העץ המקורי פלוס גובה העץ.
ניתוח סיבוכיות לשיעורין:
ניתוח של רצף הכנסות אל עץ ריק עבור המקרה : עלות כל פעולת הכנסה ממשית היא הגובה פלוס גודל הבניה מחדש: .
אנו "נגבה" (Charge) על כל הכנסה מחיר מוגדל של .
מתוך הסכום הזה נשלם מיד על פעולת ההכנסה העדכנית ב-BST, ונפזר 3 דולרים כחיסכון עתידי בכל אחד מהצמתים הפנימיים במסלול מהשורש ועד לעלה החדש.
הבטחת תשלום: כאשר צומת יוצא מאיזון, נוכל להראות שמספר פעולות ההכנסה שבוצעו בו מאז האיזון הקודם שלו הוא לפחות .
כיוון שכל אחת מהכנסות אלו הפקידה 3 דולרים אצלו, הצומת יאגור בסך הכל לפחות דולרים. זהו בדיוק הסכום הנדרש כדי לשלם על הבניה מחדש במקרה הגרוע.
סה"כ עלות אמורטיזית עבור כל צעד היא (שכן החיוב הוא כפולת גובה העץ), ולכן עבור פעולות משלמים בתוחלת זמן של .